package com.itlzh.mall.common.handler;

import com.baomidou.mybatisplus.core.toolkit.AES;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.util.StringUtils;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
 * 字段加密和解密处理器
 * 字段加密和解密是对敏感字段进行加密处理后入库，查询的时候需要解密后展示。
 */
public class EncryptHandler extends BaseTypeHandler<String> {
    // 密钥(16*N位数)，一旦指定不能再修改
    private static final String AES_KEY = "BgKLBcLdAgZK7s64";

    /**
     *
     * @param ps:  PreparedStatement 执行sql语句的对象
     * @param i ： 参数索引，即第几个参数
     * @param parameter ：要设置的参数值
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        //对参数进行加密
        if(StringUtils.isEmpty(parameter)){
            ps.setString(i,null);
        }else{
            //加密后存入数据库
            String encrypt = AES.encrypt(parameter, AES_KEY);
            ps.setString(i,encrypt);
        }
    }

    //根据字段名获取字段
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        //获取结果集的值
        String value=rs.getString(columnName);
        if(StringUtils.isEmpty(value)){
            return null;
        }
        //解密
        return AES.decrypt(value, AES_KEY);
    }

    //根据字段索引获取字段
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        //获取结果集的值
        String value=rs.getString(columnIndex);
        if(StringUtils.isEmpty(value)){
            return null;
        }
        //返回解密后的值
        return AES.decrypt(value, AES_KEY);
    }
    //根据存储过程获取字段
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value=cs.getString(columnIndex);
        if(StringUtils.isEmpty(value)){
            return null;
        }
        return AES.decrypt(value, AES_KEY);
    }
}
